Мамед
раскладывает свои книги на полку. Если на полке нет ни одной книги, то он
просто ставит её, если есть, то ставит либо справа, либо слева от уже
расставленных книг. Забирает книги он так же, то есть снимает только с правого
или левого края. По задаваемой информации требуется смоделировать действия
Мамеда и вывести номера книг, которые он будет снимать.
Вход. В первой
строке содержится число n (1 ≤ n ≤ 10000) – количество операций,
которые выполнил Мамед. Далее в n
строках находится информация об операциях. Каждая операция постановки книги на
полку описывается парой чисел.
Первое из
них (1 или 2) показывает, книга ставится с левого края или с правого
соответственно, второе целое число (от 0 до 10000) обозначает номер книги.
Операции снятия книги с полки описывается одним числом – 3 или 4, с левого и
правого края соответственно.
Выход. Для
каждой операции снятия книги с полки вывести номер снимаемой книги.
Пример входа |
Пример выхода |
10 1 1 2 2 1 3 2 7 2 9 3 4 3 3 4 |
3 9 1 2 7 |
очередь
Полка, на
которую ставятся книги, представляет собой двустороннюю очередь. В задаче
следует промоделировать следующие операции:
push_front(x) – книгу
номер x ставим слева;
push_back(x) – книгу
номер x ставим справа;
pop_front() – снимаем книгу с левого края;
pop_back() – снимаем книгу с правого края;
Пример
Рассмотрим
порядок расстановки книг на полке.
Книги с
полки извлекаются в следующем порядке:
pop_front() – книга номер 3;
pop_back() – книга номер 9;
pop_front() – книга номер 1;
pop_front() – книга номер 2;
pop_back() – книга номер 7;
Реализация алгоритма
Объявим
рабочую очередь.
deque<int> s;
Читаем количество
операций n.
scanf("%d",&n);
Последовательно обрабатываем n операций.
for(i = 0; i < n; i++)
{
Читаем код
операции cmd.
scanf("%d",&cmd);
if (cmd == 1)
{
Ставим книгу номер val
на полку с левого края.
scanf("%d",&val);
s.push_front(val);
} else
if (cmd == 2)
{
Ставим книгу номер val
на полку с правого края.
scanf("%d",&val);
s.push_back(val);
} else
if (cmd == 3)
{
Выводим номер книги с левого края и снимаем ее.
printf("%d\n",s.front());
s.pop_front();
} else
{
Выводим номер книги с правого края и снимаем ее.
printf("%d\n",s.back());
s.pop_back();
}
}
Java реализация – LinkedList
import java.util.*;
public class Main
{
public static void
main(String[] args)
{
Scanner con = new
Scanner(System.in);
Deque<Integer> q = new LinkedList<Integer>();
int n = con.nextInt();
for (int i = 0; i < n; i++)
{
int cmd = con.nextInt();
if (cmd == 1)
{
int val = con.nextInt();
q.addFirst(val);
} else
if (cmd == 2)
{
int val = con.nextInt();
q.addLast(val);
} else
if (cmd == 3)
{
System.out.println(q.getFirst());
q.removeFirst();
} else
{
System.out.println(q.getLast());
q.removeLast();
}
}
con.close();
}
}
Java реализация – LinkedList class
import
java.util.*;
class
Node
{
int data;
Node next;
public Node()
{
data = 0;
next = null;
}
public Node(int data)
{
this.data = data;
this.next = null;
}
}
class
LinkedList
{
Node head, tail;
public LinkedList()
{
head = null;
tail = null;
}
public boolean
Empty()
{
return head == null;
}
public void
addFirst(int val)
{
if (tail == null) // list is empty
head = tail = new Node(val);
else
{
Node temp = new Node(val);
temp.next = head;
head = temp;
}
}
public void addLast(int val)
{
if (tail != null) // list is
not empty
{
tail.next = new Node(val);
tail = tail.next;
}
else head = tail = new Node(val);
}
public boolean
removeFirst()
{
if (Empty())
return false;
if (head == tail) // only
one node in a list
head = tail = null;
else head = head.next;
return true;
}
public boolean
removeLast()
{
if (Empty())
return false;
if (head == tail) // only
one node in a list
{
head = tail = null;
}
else // if more
than one node in the list
{
Node temp;
// find
the predecessor of tail
for(temp = head; temp.next != tail; temp = temp.next);
tail = temp; // the
predecessor of tail becomes tail
tail.next = null;
}
return true;
}
public int
getFirst()
{
return head.data;
}
public int getLast()
{
return tail.data;
}
}
public class Main
{
public static void
main(String[] args)
{
Scanner con = new
Scanner(System.in);
LinkedList list = new
LinkedList();
int n = con.nextInt();
for (int i = 0; i < n; i++)
{
int cmd = con.nextInt();
if (cmd == 1)
{
int val = con.nextInt();
list.addFirst(val);
} else
if (cmd == 2)
{
int val = con.nextInt();
list.addLast(val);
} else
if (cmd == 3)
{
System.out.println(list.getFirst());
list.removeFirst();
} else
{
System.out.println(list.getLast());
list.removeLast();
}
}
con.close();
}
}
Python реализация
Объявим
рабочую очередь q.
from collections import deque
q = deque()
Читаем количество
операций n.
n = int(input())
Последовательно обрабатываем n операций.
for i in range(n):
op, *lst = list(map(int, input().split()))
if op == 1:
Ставим книгу номер lst[0] на полку с левого края.
q.appendleft(lst[0])
elif op == 2:
Ставим книгу номер lst[0] на полку с правого края.
q.append(lst[0])
elif op == 3:
Выводим номер книги с левого края и снимаем ее.
print(q.popleft())
else:
Выводим номер книги с правого края и снимаем ее.
print(q.pop())